// 实现一个 flatten 函数，实现如下的转换功能
const obj = {
    a: 1,
    b: [1, 2, { c: true },[3]],
    c: { e: 2, f: 3 },
    g: null,
};
// 转换为 因为嵌套里的key可能重复，可能导致flat出来的对象缺少一些key
let objRes = {
    a: 1,
    "b[0]": 1,
    "b[1]": 2,
    "b[2].c": true,
    'b[3][0]': 3,
    "c.e": 2,
    "c.f": 3,
    g: null,
};

function objFlat(obj) {
    let res = {}
    function process(key,value) {
        if (typeof value !== 'object') {
            res[key] = value
        }
        else if (Array.isArray(value)) {
            value.forEach((item,index) => {
                process(`${key}[${index}]`,item)
            })
            if (value.length === 0) {
                result[key] = [];
            }
        }
        //? 对象 注意 typeof null也是object
        else {
            //? 处理null的情况
            if (value === null) {
                res[key] = value
                return
            }
            let objArr = Object.keys(value)
            //? 处理外层的key不用.x的形式 而内层需要.x的形式 故这里初始值key为空以保证外层和内层的对象不同处理
            objArr.forEach(item => {
                process(key ? `${key}.${item}` : `${item}`, value[item])
            })
            if (objArr.length === 0 && key) {
                res[key] = {};
            }
        }
    }
    process('',obj)
    return res
}
console.log(objFlat(obj));
